package cn.jietuo.helloworld;

import cn.jietuo.util.RabbitConstant;
import cn.jietuo.util.RabbitUtil;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author zhangx & jietuo_zx@163.com
 * @version 1.0
 * @date 2021/2/15
 * @description:  消费者
 */
public class Consumer {

    public static void main(String[] args) throws IOException {
        // 获取TCP长连接
        Connection connection = RabbitUtil.getConnection();
        // 创建通信通道，相当于TCP中的虚拟连接
        final Channel channel = connection.createChannel();
        // 创建队列
        /**
         * @param queue the name of the queue
         *             队列名称ID
         * @param durable true if we are declaring a durable queue (the queue will survive a server restart)
         *                是否持久化数据，false对应不持久化，MQ停掉数据救护丢失
         * @param exclusive true if we are declaring an exclusive queue (restricted to this connection)
         *                  是否队列私有化，false代表所有消费者都可以访问，true代表只有第一次拥有它的消费者才能一直使用它，其他消费者不让访问
         * @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use)
         *                   是否自动删除，false代表连接停掉之后不自动删除这个队列
         * @param arguments other properties (construction arguments) for the queue
         *                  其他额外的参数
         */
        channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD,false,false,false,null);

        //  从MQ服务器中获取数据
        channel.basicConsume(RabbitConstant.QUEUE_HELLOWORLD,false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("接受到的消息：" + message);
                System.out.println("消息ID为：" + envelope.getDeliveryTag());
                //false只确认签收当前的消息，设置为true的时候则代表签收该消费者所有未签收的消息
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        });

    }
}
